from flask import Blueprint, request, jsonify
from app.models import StreetStats, DetectionEvent
from app.extensions import db
from datetime import datetime, date
from sqlalchemy import func
from routes.auth import token_required

street_bp = Blueprint('street', __name__, url_prefix='/api/v1')


def update_street_stats():
    """
    定时更新街道统计数据（每日凌晨执行）。
    功能：统计前一天的数据，如果记录已存在则更新，不存在则创建，避免数据重复。
    """
    yesterday = date.today() - datetime.timedelta(days=1)
    print(f"开始更新 {yesterday} 的街道统计数据...")

    # 按街道分组统计
    street_data = db.session.query(
        DetectionEvent.street_name,
        func.count().label('total_count'),
        # 统计出现次数最多的垃圾类型
        func.substr(func.max(func.concat(
            func.lpad(func.count(DetectionEvent.class_), 10),
            DetectionEvent.class_
        )), 11).label('top_class')
    ).filter(
        func.date(DetectionEvent.detect_time) == yesterday,
        DetectionEvent.street_name.isnot(None)
    ).group_by(
        DetectionEvent.street_name
    ).all()

    # 保存或更新统计结果
    for item in street_data:
        # 尝试根据 street_name 和 date 查找已存在的记录
        existing_stats = StreetStats.query.filter_by(
            street_name=item.street_name,
            date=yesterday
        ).first()

        if existing_stats:
            # 如果记录已存在，则更新它
            existing_stats.total_count = item.total_count
            existing_stats.top_class = item.top_class
            print(f"  - 更新街道: {item.street_name}")
        else:
            # 如果记录不存在，则创建新的
            new_stats = StreetStats(
                street_name=item.street_name,
                date=yesterday,
                total_count=item.total_count,
                top_class=item.top_class,
                heatmap_data={}
            )
            db.session.add(new_stats)
            print(f"  - 创建街道: {item.street_name}")

    db.session.commit()
    print(f"✅ 已成功更新/创建 {yesterday} 的街道统计数据！")


@street_bp.route('/street/rank', methods=['GET'])
@token_required
def get_street_rank(current_user_id):
    """获取指定日期的街道垃圾数量排名（供前端可视化）"""
    date_str = request.args.get('date')

    if not date_str:
        return jsonify({'code': 400, 'error': '缺少日期参数，请提供 date=YYYY-MM-DD'}), 400

    try:
        query_date = datetime.strptime(date_str, '%Y-%m-%d').date()
    except ValueError:
        return jsonify({'code': 400, 'error': '日期格式错误，需为YYYY-MM-DD'}), 400

    # 查询统计数据
    ranks = StreetStats.query.filter(
        StreetStats.date == query_date
    ).order_by(
        StreetStats.total_count.desc()
    ).limit(10).all()

    # 处理没有数据的情况
    if not ranks:
        return jsonify({'code': 404, 'message': f'该日期 {query_date} 暂无统计数据'}), 404

    # 格式化返回结果
    result = [{
        'street_name': r.street_name,
        'total_count': r.total_count,
        'top_class': r.top_class
    } for r in ranks]

    return jsonify({'code': 200, 'data': result})